package columnd

import (
	"time"

	ccolumnd "gogs.xiaoyuanjijiehao.com/antlinker/antcms/core/columnd"
	"gogs.xiaoyuanjijiehao.com/antlinker/antcms/core/common"
	"gogs.xiaoyuanjijiehao.com/antlinker/antcms/ddd"
)

// columnExtraItem 栏目扩展属性
type columnExtraItem struct {
	Name        string                 `bson:"name"`        // 扩展属性名称
	Code        string                 `bson:"code"`        // 扩展属性编码
	Kind        string                 `bson:"kind"`        // 扩展属性类型
	Placeholder string                 `bson:"placeholder"` // 扩展属性占位符
	Required    int                    `bson:"required"`    // 是否必填
	Isupdate    int                    `json:"isupdate"`    // 是否可以被客户端更改1 是 0 否
	Message     string                 `bson:"message"`     // 校验消息
	Rules       string                 `bson:"rules"`       // 校验规则
	ParamValues map[string]interface{} `bson:"paramValues"` // 类型扩展参数
}

func (i *columnExtraItem) Full(cei ccolumnd.ColumnExtraItem) {
	i.Name = cei.Name
	i.Code = cei.Code
	i.Kind = cei.Kind
	i.Placeholder = cei.Placeholder
	i.Required = cei.Required
	i.Isupdate = cei.Isupdate
	i.Message = cei.Message
	i.Rules = cei.Rules
	i.ParamValues = cei.ParamValues
}
func (i *columnExtraItem) To() (cei ccolumnd.ColumnExtraItem) {
	cei.Name = i.Name
	cei.Code = i.Code
	cei.Kind = i.Kind
	cei.Placeholder = i.Placeholder
	cei.Required = i.Required
	cei.Message = i.Message
	cei.Rules = i.Rules
	cei.ParamValues = i.ParamValues
	cei.Isupdate = i.Isupdate
	return
}

// @collname 栏目集合(i_column)
type collColumn struct {
	ColumnID         string              `bson:"_id" `
	Name             string              `bson:"name"`             // 栏目名称
	ShortName        string              `bson:"shortName"`        // 栏目短名称
	Kind             ccolumnd.ColumnKind `bson:"kind"`             // 栏目类型（1 系统栏目 2 专题栏目 3 交流互动）
	Owner            string              `bson:"owner"`            // 所属用户
	Org              string              `bson:"org"`              // 所属组织
	Icon             []string            `bson:"icon"`             // 栏目标志
	Page             string              `bson:"page"`             // 栏目封面
	Banner           string              `bson:"banner"`           // 栏目旗帜
	Desc             string              `bson:"desc"`             // 栏目介绍
	ParentID         string              `bson:"parentID"`         // 上级栏目
	Status           int                 `bson:"status"`           // 状态 状态 0 正常  -1 删除
	InfoNum          int                 `bson:"infoNum"`          // 信息总数量
	PubNum           int                 `bson:"pubNum"`           // 信息发布数量
	Infourl          string              `bson:"infourl"`          // 栏目信息详情展示页面连接
	IsColReply       int                 `bson:"isColReply"`       // 是否开启栏目评论 0 不开启 1 开启
	IsReply          int                 `bson:"isReply"`          // 是否开启信息评论 0 不开启 1 开启
	IsChk            int                 `bson:"isChk"`            // 发评论审核模式  0 不需要审核  1 需要所有者审核 2 需要组织审核 3 需要平台审核
	IsInfoChk        int                 `bson:"isInfoChk"`        // 是否开启栏目信息审核 0 不开启 1 开启
	AllowIntCode     []string            `bson:"allowIntCode"`     // 允许的互动模式 对应InteractionTypeDesc中的Code
	IsSubmit         int                 `bson:"isSubmit"`         // 是否允许投稿 0 不开启 1 开启
	IsPublic         int                 `bson:"isPublic"`         // 是否允许公开 0 不开启 1 开启
	IsOrg            int                 `bson:"isOrg"`            // 是否允许其他组织调用 0 不开启 1 开启
	InfoMode         int                 `bson:"infoMode"`         // 信息编辑模式 0 多篇文章模式 1 单篇文章模式
	ProhibitPostInfo int                 `bson:"prohibitPostInfo"` // 禁止发信息 0 不开启 1 开启
	Creator          string              `bson:"creator"`          // 创建人
	CreTime          time.Time           `bson:"creTime"`          // 创建时间
	UpdateTime       time.Time           `bson:"updateTime"`       // 最后更新时间
	Updater          string              `bson:"updater"`          // 最后更新人
	DeleteTime       time.Time           `bson:"deleteTime"`       // 删除时间
	Deleter          string              `bson:"deleter"`          // 删除人
	Extras           []columnExtraItem   `bson:"extras"`           // 扩展字段配置
}

func (c collColumn) CollID() string {
	return c.ColumnID
}
func (collColumn) CollName() string {
	// TODO: 这里可以提取为常量
	return collNameColumn
}
func (c collColumn) IsCache() bool {
	return c.ColumnID != "" && c.Status == 0
}

func (c *collColumn) FullDesc(e ccolumnd.ColumnDesc) {
	c.Name = e.Name
	c.ShortName = e.ShortName
	c.Kind = e.Kind
	c.Owner = e.Owner
	c.Org = e.Org
	c.Icon = e.Icon
	c.Page = e.Page
	c.Banner = e.Banner
	c.Desc = e.Desc
	c.ParentID = e.ParentID
}
func (c collColumn) ToDesc() ccolumnd.ColumnDesc {
	return ccolumnd.ColumnDesc{
		Name:      c.Name,
		ShortName: c.ShortName,
		Kind:      c.Kind,
		Owner:     c.Owner,
		Org:       c.Org,
		Icon:      c.Icon,
		Page:      c.Page,
		Banner:    c.Banner,
		Desc:      c.Desc,
		ParentID:  c.ParentID,
	}
}

func (c *collColumn) FullStatus(e ccolumnd.ColumnStatus) {
	c.Status = e.Status
	c.InfoNum = e.InfoNum
	c.PubNum = e.PubNum

}
func (c collColumn) ToStatus() ccolumnd.ColumnStatus {
	return ccolumnd.ColumnStatus{
		Status:  c.Status,
		InfoNum: c.InfoNum,
		PubNum:  c.PubNum,
	}
}

func (c *collColumn) FullParam(e ccolumnd.ColumnCtlParam) {
	c.IsColReply = e.IsColReply
	c.IsReply = e.IsReply
	c.IsChk = e.IsChk
	c.IsInfoChk = e.IsInfoChk
	c.AllowIntCode = e.AllowIntCode
	c.IsSubmit = e.IsSubmit
	c.IsPublic = e.IsPublic
	c.IsOrg = e.IsOrg
	c.InfoMode = e.InfoMode
	c.ProhibitPostInfo = e.ProhibitPostInfo
	c.Infourl = e.Infourl

}
func (c collColumn) ToParam() ccolumnd.ColumnCtlParam {
	return ccolumnd.ColumnCtlParam{
		IsColReply:       c.IsColReply,
		IsReply:          c.IsReply,
		IsChk:            c.IsChk,
		IsInfoChk:        c.IsInfoChk,
		AllowIntCode:     c.AllowIntCode,
		IsSubmit:         c.IsSubmit,
		IsPublic:         c.IsPublic,
		IsOrg:            c.IsOrg,
		InfoMode:         c.InfoMode,
		ProhibitPostInfo: c.ProhibitPostInfo,
		Infourl:          c.Infourl,
	}
}

func (c *collColumn) FullOperator(e common.Operator) {
	c.Creator = e.Creator
	c.CreTime = e.CreTime
	c.UpdateTime = e.UpdateTime
	c.Updater = e.Updater
	c.DeleteTime = e.DeleteTime
	c.Deleter = e.Deleter

}
func (c collColumn) ToOperator() common.Operator {
	return common.Operator{
		Creator:    c.Creator,
		CreTime:    c.CreTime,
		UpdateTime: c.UpdateTime,
		Updater:    c.Updater,
		DeleteTime: c.DeleteTime,
		Deleter:    c.Deleter,
	}
}
func (c collColumn) ToExtras() []ccolumnd.ColumnExtraItem {
	l := len(c.Extras)
	if l > 0 {
		tmp := make([]ccolumnd.ColumnExtraItem, l)
		for i := 0; i < l; i++ {
			tmp[i] = c.Extras[i].To()
		}
		return tmp
	}
	return nil
}
func (c collColumn) ToAggregate() ddd.Aggregate {
	return c.ToColumnAggregate()
}
func (c collColumn) ToColumnAggregate() *ccolumnd.ColumnAggregate {
	return &ccolumnd.ColumnAggregate{
		ColumnID:       c.ColumnID,
		ColumnDesc:     c.ToDesc(),
		ColumnStatus:   c.ToStatus(),
		ColumnCtlParam: c.ToParam(),
		Operator:       c.ToOperator(),
		Extras:         c.ToExtras(),
	}

}
